#ifndef __THREADPOOL_H__
#define __THREADPOOL_H__

#define THR_MAX	1024

/*
 池的状态
 	shutdown 优先级别最高，所有的线程只要看到shutdown为真，就终止
	exit_cnt > 0 次优先级，所有的工作线程
								先看shutdown是否为真，为真则终止
								再看exit_cnt > 0,为真则终止
								最后取任务
 */

// 任务数据类型
typedef struct {
	void *(*thr_task_p)(void *);
	void *arg;
}task_t;

typedef struct {
	pthread_t admin_tid; // 管理者线程
	pthread_t *workers; // 工作线程
	queue_t *task_queue; // 任务队列	

	pthread_mutex_t pool_mut; // 多线程访问结构体同步
	pthread_cond_t task_cond_not_empty; // 不空 取任务
	pthread_cond_t task_cond_not_full; // 不满 放任务

	// 管理者线程决策工作线程的个数
	int alive_cnt;
	int busy_cnt;
	pthread_mutex_t busy_mut; // 为busy_cnt单独设立一个互斥量
	int exit_cnt; // 待终止的线程个数
	int shutdown; // 池关闭
	int thrs_min_cnt; // 至少保证的线程个数
	int thrs_max_cnt; // 线程池工作线程最大个数
}thrpool_t;

// 初始化
int thread_pool_init(thrpool_t **mypool, int min_cnt, int max_cnt);

// 添加任务
int thread_pool_add_task(thrpool_t *mypool, const task_t *mytask);

// 销毁
void thread_pool_destroy(thrpool_t **mypool);

#endif

